﻿using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using RIABlog.Web;

namespace RIABlog.Views
{
	/// <summary>
	/// Базовый класс для всех страниц
	/// </summary>
    public abstract class BlogPageBase : Page
    {
        /// <summary>
        /// Ссылка на экземпляр приложения
        /// </summary>
        protected App App
        {
            get { return (App) Application.Current; }
        }

        /// <summary>
        /// Ссылка на экземпляр контекста доступа к данным
        /// </summary>
        protected RIABlogContext BlogContext
        {
            get { return this.App.BlogContext; }
        }

        /// <summary>
        /// Перейти на домашнюю страницу
        /// </summary>
        protected void NavigateHome()
        {
            this.NavigationService.Navigate(new Uri("/Home", UriKind.Relative));
        }

        /// <summary>
        /// Сохранить изменения и перейти на домашнюю страницу
        /// </summary>
        protected void SaveChanges()
        {
            this.SaveChanges(new Uri("/Home", UriKind.Relative));
        }

        /// <summary>
        /// Сохранить изменения и перейти
        /// </summary>
        /// <param name="uriNavigateTo">Страница, куда перейти</param>
        protected void SaveChanges(Uri uriNavigateTo)
        {
            this.BlogContext.SubmitChanges
                (
                    op =>
                    	{
                    		if (!op.HasError) 
								this.NavigationService.Navigate(uriNavigateTo);
                    	},
                    null
                );
        }

        /// <summary>
        /// Запрещаем переход на другую страницу без сохранения изменений
        /// </summary>
        /// <param name="e"></param>
        protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
        {
            // если были изменения, выполняем сохранение
            if (this.BlogContext.HasChanges)
            {
                e.Cancel = true;

                if (MessageBox.Show(ApplicationStrings.SaveChangesQueryText, ApplicationStrings.QuestionText, MessageBoxButton.OKCancel) == MessageBoxResult.OK)
                {
                    this.SaveChanges(e.Uri);
                }

                return;
            }

            base.OnNavigatingFrom(e);
        }
    }
}
